package com.alaia.alaiaauth.filter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.session.SessionRegistryImpl;
import org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy;

@Configuration
public class FilterConfig {

    @Autowired
    private AuthenticationManager authenticationManager;
    /**
     * 重写springsecurity 中的登录接口 支持json登录
     */
    @Bean
    LoginFilter loginFilter() throws Exception {
        LoginFilter loginFilter = new LoginFilter();
        //这里替换了校验方法，换成我们的（authenticationManager()）
        //有两种方式做认证，这里我们屏蔽掉我们自己定义的authenticationManager，而是去自定义ProviderManager，将使用我们自己的authenticationManager
//        loginFilter.setAuthenticationManager(authenticationManager());
        ConcurrentSessionControlAuthenticationStrategy sessionStrategy = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry());
        sessionStrategy.setMaximumSessions(1);
        loginFilter.setSessionAuthenticationStrategy(sessionStrategy);
        loginFilter.setFilterProcessesUrl("/doLogin");
        loginFilter.setAuthenticationManager(authenticationManager);
        return loginFilter;
    }

    //这里我们目前没有用到，但是逻辑是当我们使用自定义的filter时，可以重写认证的方式哦，默认使用ProviderManager（认证处理器）
    private AuthenticationManager authenticationManager() {
        return usernamePasswordAuthenticationToken-> {
            //这里做了校验，自定义认证逻辑，正常情况下，会去ProviderManager#authenticate中调用Authentication对应的AuthenticationProvider进行认证
            //比如用户名密码的默认认证提供是：DaoAuthenticationProvider
            Object principal = usernamePasswordAuthenticationToken.getPrincipal();
            Object credentials = usernamePasswordAuthenticationToken.getCredentials();
            return usernamePasswordAuthenticationToken;
        };
    }
      //使用springsession接管当前配置
    @Bean
    SessionRegistryImpl sessionRegistry() {
        return new SessionRegistryImpl();
    }

}
